package models

import (
	"fmt"
	"gorm.io/gorm"
	"time"
)

// UserProRole 用户项目角色关联表
type UserProRole struct {
	ID        uint64    `gorm:"primaryKey;autoIncrement" json:"id" form:"id"`
	UserID    uint64    `gorm:"notNull" json:"user_id" form:"user_id"`
	ProRoleID uint64    `gorm:"notNull" json:"pro_role_id" form:"pro_role_id"`
	TeamID    uint64    `gorm:"notNull" json:"team_id" form:"team_id"`
	CreatedAt time.Time `gorm:"column:created_at;type:timestamp;default:CURRENT_TIMESTAMP" json:"created_at" form:"created_at"`
	UpdatedAt time.Time `gorm:"column:updated_at;type:timestamp;default:CURRENT_TIMESTAMP" json:"updated_at" form:"updated_at"`
}

func (UserProRole) TableName() string {
	return "user_pro_roles"
}

// TeamIDAndProRole 用于记录在 user_pro_role 表中查询到的 （用户团队id，用户角色id）
type TeamIDAndProRole struct {
	TeamID    uint64 `gorm:"column:team_id"`
	ProRoleID uint64 `gorm:"column:pro_role_id"`
}

//	GetUserTeamsAndRoles
//
// 描述信息： 根据用户ID获取用户所属的所有团队及其角色
//
// Param：
//
//	db ：数据库连接实例
//	userID ：用户id
//
// Return：
//
//	[]TeamIDAndProRole ：用户的全部（用户团队id，用户角色id）
//	error ：错误信息
func GetUserTeamsAndRoles(db *gorm.DB, userID uint64) ([]TeamIDAndProRole, error) {
	var userTeamsAndRoles []TeamIDAndProRole
	if err := db.Model(&UserProRole{}).Select("team_id", "pro_role_id").Where("user_id = ?", userID).Find(&userTeamsAndRoles).Error; err != nil {
		return nil, fmt.Errorf("failed to query user teams and roles: %w", err)
	}
	return userTeamsAndRoles, nil
}

// UserAndProPermissionsDetail 定义用户和项目角色权限
type UserAndProPermissionsDetail struct {
	User           User            //定义用户信息结构体
	ProPermissions []ProPermission //定义用户权限切片
}

// CheckRecordExists 根据 UserID 和 TeamID 判断是否存在记录
func (u UserProRole) CheckRecordExists(db *gorm.DB, userID uint64, teamID uint64) (bool, error) {
	var count int64
	err := db.Model(&UserProRole{}).Where("user_id = ? AND team_id = ?", userID, teamID).Count(&count).Error
	if err != nil {
		return false, err
	}
	return count > 0, nil
}

// InsertIfNotExists 根据 UserID 和 TeamID 插入记录（如果不存在）
func (u UserProRole) InsertIfNotExists(db *gorm.DB, userID uint64, teamID uint64, proRoleID uint64) error {
	// 检查是否存在记录
	exists, err := UserProRole{}.CheckRecordExists(db, userID, teamID)
	if err != nil {
		return err
	}

	// 如果记录已存在，直接返回
	if exists {
		return nil
	}

	// 如果记录不存在，插入新记录
	newRecord := UserProRole{
		UserID:    userID,
		ProRoleID: proRoleID,
		TeamID:    teamID,
	}

	// 插入记录
	return db.Create(&newRecord).Error
}

//	DeleteUserProRoleByUserIDAndTeamID
//
// 描述信息： 根据 user_id 和 team_id 删除一条数据
//
// Param：
//
//	db ：数据库链接实例
//	userID ：用户id
//	teamID ：团队id
//
// Return：
//
//	error ：错误信息
func (u UserProRole) DeleteUserProRoleByUserIDAndTeamID(db *gorm.DB, userID uint64, teamID uint64) error {
	// 删除操作
	result := db.Where("user_id = ? AND team_id = ?", userID, teamID).Delete(&UserProRole{})
	if result.Error != nil {
		// 如果发生错误，返回错误
		return result.Error
	}
	return nil
}

// DeleteUserProRoleByTeamID 根据 team_id 删除所有相关的 UserProRole 记录
func (u UserProRole) DeleteUserProRoleByTeamID(db *gorm.DB, teamID uint64) error {
	result := db.Where("team_id = ?", teamID).Delete(&UserProRole{})
	if result.Error != nil {
		return fmt.Errorf("failed to delete user pro roles with team_id %d: %w", teamID, result.Error)
	}
	return nil
}
